package se.kernel;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class ThreadRecibirArchivosMulticast implements Runnable
{
    private MulticastSocket socket;
    private InetAddress dir;
    private int tamanioPaquete;

    public ThreadRecibirArchivosMulticast( int puertoGrupo, int tamanioPaquete ) throws IOException
    {
        socket = new MulticastSocket( puertoGrupo );
        dir = InetAddress.getByName( "224.63.63.64" );
        socket.joinGroup( dir );
        this.tamanioPaquete = tamanioPaquete;
    }

    @Override
    public void run( )
    {
        try
        {
            int leido = 0;
            boolean acabo = false;
            byte[] buffer = new byte[4096];
            DatagramPacket paquete = new DatagramPacket( buffer, buffer.length );
            socket.receive( paquete );
            int tamanioNombre = ( buffer[ 0 ] << 8 ) + buffer[ 1 ];
            String nombre = new String( darBytes( buffer, 2, tamanioNombre + 2 ) );
            File folder = new File( "MisArchivosRecibidos" );
            if( !folder.exists( ) )
                folder.mkdir( );
            File archivoARecibir = new File( "MisArchivosRecibidos/" + nombre );
            FileOutputStream out = new FileOutputStream( archivoARecibir );
            out.write( darBytes( buffer, tamanioNombre + 2, buffer.length ) );
            leido += 4096;
            while( !acabo )
            {
                socket.receive( paquete );
                out.write( buffer );
                leido += 4096;
                if( leido >= tamanioPaquete )
                    acabo = true;
            }
            out.close( );
            socket.close( );
        }
        catch( IOException e )
        {
            e.printStackTrace( );
        }
    }
    private byte[] darBytes( byte[] arreglo, int start, int finish )
    {
        byte[] resp = new byte[finish - start];
        for( int i = 0; i < resp.length; i++ )
            resp[ i ] = arreglo[ i + start ];
        return resp;
    }
}
